home *** CD-ROM | disk | FTP | other *** search
/ Oxygen Multimedia Graphics 22 / Oxygen Multimedia Graphics 22.iso / pc / System / OX22 / Internal_33_Avoid Mouse.ls < prev    next >
Encoding:
Text File  |  2008-03-12  |  5.0 KB  |  183 lines

  1. property pSprite, pDestination, pPeriod, pOrigTime, pDestTime, pOrigin, pVector, pMoving, pStageBounds, pMaxSpeed, pDistance, pSpeed, pActive, pLimited
  2.  
  3. on getBehaviorDescription me
  4.   return "AVOID MOUSE" & RETURN & RETURN & "Moves sprite away from cursor, constrained within the stage area. " & "As the cursor approaches the sprite, the sprite moves to maintain the distance specified in the behavior parameterization." & RETURN & RETURN & "PARAMETERS:" & RETURN & "* Distance between cursor and center of sprite" & RETURN & "* Speed in pixels/second" & RETURN & "* Active (avoiding cursor) at start?" & RETURN & "* Limited to stage area?"
  5. end
  6.  
  7. on getBehaviorTooltip me
  8.   return "Makes a sprite appear to flee from the cursor. " & "The distance and speed of avoidance can be set."
  9. end
  10.  
  11. on beginSprite me
  12.   mInitialize(me)
  13. end
  14.  
  15. on prepareFrame me
  16.   mUpdate(me)
  17.   mTrackCursor(me)
  18. end
  19.  
  20. on mCenter vRect
  21.   vHalfWidth = vRect.width / 2
  22.   vHalfHeight = vRect.height / 2
  23.   return point(vRect.left + vHalfWidth, vRect.top + vHalfHeight)
  24. end
  25.  
  26. on mCenterOffset vRect
  27.   vCenter = mCenter(vRect)
  28.   return vCenter - sprite(pSprite).loc
  29. end
  30.  
  31. on mCenteredRect vPoint, vRect
  32.   vWidth = vRect.width
  33.   vHeight = vRect.height
  34.   vHalfWidth = vWidth / 2
  35.   vHalfHeight = vHeight / 2
  36.   vLeft = vPoint.locH - vHalfWidth
  37.   vTop = vPoint.locV - vHalfHeight
  38.   return rect(vLeft, vTop, vLeft + vWidth, vTop + vHeight)
  39. end
  40.  
  41. on mFixedLengthVector vVector, vLength
  42.   vNewVector = vVector * vLength / max(1, mVectorLength(vVector))
  43.   return vNewVector
  44. end
  45.  
  46. on mInitialize me
  47.   pSprite = me.spriteNum
  48.   pMaxSpeed = 1000
  49.   pSpeed = min(pMaxSpeed, max(1, integer(pSpeed)))
  50.   pOrigin = sprite(pSprite).loc + mCenterOffset(sprite(pSprite).rect)
  51.   pDestination = pOrigin
  52.   pOrigTime = the milliSeconds
  53.   pDestTime = pOrigTime + 1
  54.   pPeriod = 1
  55.   pVector = point(0, 0)
  56.   pMoving = 0
  57.   pStageBounds = point((the stage).sourceRect.width, (the stage).sourceRect.height)
  58.   mSetDest(pDestination)
  59. end
  60.  
  61. on mSetDest vDest
  62.   if pActive then
  63.     pDestination = vDest
  64.     pOrigin = sprite(pSprite).loc + mCenterOffset(sprite(pSprite).rect)
  65.     pVector = pDestination - pOrigin
  66.     vDistance = mVectorLength(pVector)
  67.     pPeriod = max(1, 1000 * vDistance / pSpeed)
  68.     pOrigTime = the milliSeconds
  69.     pDestTime = pOrigTime + pPeriod
  70.     pMoving = 1
  71.   end if
  72. end
  73.  
  74. on mStageLimit vRect
  75.   if vRect.left < 0 then
  76.     vOffsetH = -vRect.left
  77.   else
  78.     vOffsetH = min(0, pStageBounds.locH - vRect.right)
  79.   end if
  80.   if vRect.top < 0 then
  81.     vOffsetV = -vRect.top
  82.   else
  83.     vOffsetV = min(0, pStageBounds.locV - vRect.bottom)
  84.   end if
  85.   return offset(vRect, vOffsetH, vOffsetV)
  86. end
  87.  
  88. on mTrackCursor me
  89.   if pActive then
  90.     vCursor = the mouseLoc
  91.     vVector = mVectorAway()
  92.     if mVectorLength(vVector) < pDistance then
  93.       if vVector = point(0, 0) then
  94.         vVector = point((random(2) * 2) - 3, (random(2) * 2) - 3)
  95.       end if
  96.       vDest = the mouseLoc + mFixedLengthVector(vVector, pDistance)
  97.       mSetDest(vDest)
  98.     else
  99.       pMoving = 0
  100.     end if
  101.   end if
  102. end
  103.  
  104. on mUpdate me
  105.   if pActive then
  106.     if pMoving then
  107.       if the milliSeconds > pDestTime then
  108.         vRect = mCenteredRect(pDestination, sprite(pSprite).rect)
  109.         if pLimited then
  110.           vRect = mStageLimit(vRect)
  111.         end if
  112.         sprite(pSprite).rect = vRect
  113.         pMoving = 0
  114.       else
  115.         vElapsed = the milliSeconds - pOrigTime
  116.         vMoveVector = pVector * vElapsed / pPeriod
  117.         vRect = mCenteredRect(pOrigin + vMoveVector, sprite(pSprite).rect)
  118.         if pLimited then
  119.           vRect = mStageLimit(vRect)
  120.         end if
  121.         sprite(pSprite).rect = vRect
  122.       end if
  123.     end if
  124.   end if
  125. end
  126.  
  127. on mVectorAway
  128.   return mCenter(sprite(pSprite).rect) - the mouseLoc
  129. end
  130.  
  131. on mVectorLength vVector
  132.   vSquare = (vVector.locH * vVector.locH) + (vVector.locV * vVector.locV)
  133.   return sqrt(vSquare)
  134. end
  135.  
  136. on mSetActive me, vBool
  137.   if not (not vBool) = vBool then
  138.     pActive = vBool
  139.     pMoving = pActive
  140.   end if
  141. end
  142.  
  143. on mSetDistance me, vDist
  144.   vDist = max(1, min(600, integer(vDist)))
  145.   pDistance = vDist
  146. end
  147.  
  148. on mSetLimited me, vBool
  149.   if not (not vBool) = vBool then
  150.     pLimited = vBool
  151.   end if
  152. end
  153.  
  154. on mSetSpeed me, vSpeed
  155.   vSpeed = max(1, min(pMaxSpeed, integer(vSpeed)))
  156.   pSpeed = vSpeed
  157.   mSetDest(me, pDestination)
  158. end
  159.  
  160. on mToggleActive me
  161.   pActive = not pActive
  162.   pMoving = pActive
  163. end
  164.  
  165. on mToggleLimited me
  166.   pLimited = not pLimited
  167. end
  168.  
  169. on isOKToAttach me, aSpriteType, aSpriteNum
  170.   return aSpriteType = #graphic
  171. end
  172.  
  173. on getPropertyDescriptionList
  174.   vSpriteRect = sprite(the currentSpriteNum).rect
  175.   vRadius = max(vSpriteRect.width, vSpriteRect.height) / 2
  176.   vPDList = [:]
  177.   setaProp(vPDList, #pDistance, [#comment: "Distance (10-600 pixels)", #format: #integer, #default: vRadius, #range: [#min: 10, #max: 600]])
  178.   setaProp(vPDList, #pSpeed, [#comment: "Speed (20-1000 pixels/sec)", #format: #integer, #default: 1000, #range: [#min: 20, #max: 1000]])
  179.   setaProp(vPDList, #pActive, [#comment: "Active at start", #format: #boolean, #default: 1])
  180.   setaProp(vPDList, #pLimited, [#comment: "Limited to stage area", #format: #boolean, #default: 1])
  181.   return vPDList
  182. end
  183.